import { ref, onUnmounted } from "vue";

/**
 * 用于创建防抖函数的 Hook
 * @param fn - 需要防抖处理的函数
 * @param delay - 防抖延迟时间，默认为 1000 毫秒
 * @returns 防抖处理后的函数
 */
export function useDebounce<T extends (...args: any[]) => any>(
    fn: T,
    delay: number = 1000
): (...args: Parameters<T>) => void {
    // 创建一个 ref 用于存储定时器 ID
    const timer = ref<number | null>(null);

    /**
     * 防抖处理后的函数
     * @param args - 传递给原始函数的参数
     */
    const debouncedFn = function (
        this: ThisParameterType<T>,
        ...args: Parameters<T>
    ) {
        // 清除之前的定时器
        if (timer.value !== null) {
            clearTimeout(timer.value);
        }

        // 设置新的定时器
        timer.value = window.setTimeout(() => {
            // 在指定延迟后调用传入的函数，并绑定 this 和参数
            fn.apply(this, args);
        }, delay);
    };

    // 在组件卸载时清除定时器
    onUnmounted(() => {
        if (timer.value !== null) {
            clearTimeout(timer.value);
        }
    });

    return debouncedFn;
}
